<h4>Field属性(options)</h4>
<p>该部分提到的属性(options)是所有Field类型都可以使用的，并且是可选的</p>
<section>
<p>null</p>
<p>Field.null</p>
<p>
如果为True，Django将空值以NULL存储到数据库中。该字段的默认值是False。字符串类型的字段(Field)例如CharField 和TextField要避免使用null，因为Django始终把空字符串储存为一个空字符串('')而不是NULL。如果字符串字段的null=True，那意味着对于“无数据”有两个可能的值：NULL和空字符串。在大多数情况下，对于“无数据”声明两个值是多余的，Django默认使用空字符串而不是NULL。
无论是字符串字段还是非字符串字段，如果你希望在表单中允许空值，你将还需要设置blank=True，因为null仅仅影响数据库存储(参见blank), blank影响的是字段的合法性检查。如果你希望BooleanField类型的值可以为空(null)，请用NullBooleanField。
</p>
<p>注意:Oracle数据库本身默认使用NULL来表示空字符串，这种行为与这个属性无关。
</p>
</section>
<section>
<p>blank</p>
<p>Field.blank</p>
<p>如果为True，则该字段允许为空白。默认值是False。注意它与null不同。null 纯粹是数据库范畴的概念，而blank是数据验证范畴的。如果字段设置blank=True，表单验证时将允许输入空值(也就是不输入任何值)。如果字段设置blank=False，则该字段为必填。
</p>
</section>
<section>
<p>choices</p>
<p>Field.choices</p>
<p>它是一个可迭代的结构(list或是tuple)，每一个迭代项都是一个二元tuple(比如[(A, B), (A, B) ...])，这个属性用来给这个字段设置可以选择的值(一种枚举)。如果设置了choices，默认html样式为选择框，而不是标准的文本框，而且这个选择框的选项就是choices中的元组。每个二元元组中的第一个元素，是存储在数据库中的值；第二个元素是该选项的一个易于人类理解的描述。比如:
</p>
<pre>
YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
)
</pre>
<p>一种比较好的用法是在模型类(Model)内部定义choices，然后再给每个值定义一个合适名字的常量。</p>
<pre>
from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in (self.JUNIOR, self.SENIOR)
</pre>
<p>虽然可以在Model的外部定义choices然后引用它，但是在Model中定义choices可以使得choices更容易使用，因为Model本身包含了所有choice相关的定义（例如，Student.SOPHOMORE可以在任何引入Student这个Model的位置使用)。对于所有设置了choices的字段(field), Django将会为其添加一个get_FOO_display()方法来获取当前字段值所对应的描述(即二元组的第二个元素)，参考<a href="https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.get_FOO_display">示例</a>。
</p>
<p>请注意choices可以是任何可迭代的对象,不一定是列表或者元组。这一点使你可以动态的构建choices。但是如果你发现你自己搞不定动态的choices，你最好还是使用ForeignKey来构建一个合适的数据库表。choices一般用在那些变动不多的静态数据上。</p>
<p>除非blank=False和default同时在某个字段(field)中被设置，否则，可选择菜单将会有"---------" 的标签。要改变这个行为, 需要给choices加入一个包含None的元组; 例如(None, 'Your String For Display'). 或者, 你可以在允许空字符串的地方用一个空字符串代替None，比如CharField类型就可以写成('', 'Your String For Display')。</p>
</section>
<section>
<p>db_column</p>
<p>Field.db_column</p>
<p这个属性用来指定field对应的数据库表的列名。</p>
</section>
<section>
<p>db_index</p>
<p>Field.db_index</p>
<p>若为True，Django将在数据库中为该field对应的列创建索引</p>
</section>
<section>
<p>db_tablespace</p>
<p>Field.db_tablespace</p>
<p>如果设置了这个属性的字段有索引的话，那么将使用数据库表空间的名称作为该字段的索引名。如果DEFAULT_INDEX_TABLESPACE已经设置，则默认值是由DEFAULT_INDEX_TABLESPACE指定, 如果没有设置则由db_tablespace指定，如果后台数据库不支持表空间，或者索引，则忽略该选项
</p>
</section>
<section>
<p>default</p>
<p>Field.default</p>
<p>该属性用于设置字段的默认值, 可以是一个值也可以是一个可调用的对象(方法，callable)。如果是可调用的类型，那么每次创建新的Model实例都会调用一次</p>
<p>这个默认值不可以是一个可变对象（如字典，列表，等等）,因为对于所有模型的一个新的实例来说，这个默认值都指向这个可调用对象或者值的同一个引用。如果想使用可变类型的对象的话，例如地点，那么就让可调用对象的方法返回这个默认值。例如，你有一个自定义的JSONField，并且想指定一个特定的字典值，可以像下面的代码一样使用：
</p>
<pre>
def contact_default():
    return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)
</pre>
<p>请注意lambda函数不可作为default这类可选参数的值.因为它们无法被migrations命令序列化.请参见文档其他部分。对于ForeignKey这种关系类型的字段，默认值应该采用这个字段引用的其他Model的对应字段的值(例如pk)，不能用Model实例对象。默认值会在新实例创建并且没有给该字段提供值时使用。如果字段为主键，默认值也会在设置为None时使用。
</p>
</section>
<section>
<p>editable</p>
<p>Field.editable</p>
<p>如果设为False, 这个字段将不会出现在admin或者其他ModelForm. 他们也会跳过模型验证. 默认是True.</p>
</section>
<section>
<p>error_messages</p>
<p>Field.error_messages</p>
<p>error_messages参数能够让你重写默认的错误信息。通过字典的形式传入，key为错误类型，value为错误信息。error_messages 的 key 值包括 null, blank, invalid, invalid_choice, unique, 和 unique_for_date. 其余的error_messages后面会有描述
</p>
</section>
<section>
<p>help_text</p>
<p>Field.help_text</p>
<p>这个属性为表单空间上显示的额外信息，即便是该字段没有在form中使用，它对于文档化也是很有帮助的。注意这不会自动添加 HTML 标签。需要你在help_text 包含自己需要的格式。例如:</p>
<pre>help_text="Please use the following format: <em>YYYY-MM-DD</em>."</pre>
<pre>另外, 你可以使用简单文本和django.utils.html.escape()来转义(例如<被转义为&lt)特定的字符.请确保你所使用的help_text能够避免那些由不受信任的用户进行的跨站点脚本攻击。</pre>
</section>
<section>
<p>primary_key</p>
<p>Field.primary_key</p>
<p>若为True, 则该字段会成为模型的主键字段。如果你没有在模型的任何字段上指定primary_key=True, Django会自动添加一个AutoField字段来充当主键。 所以除非你想要覆盖默认的主键行为，否则不需要在任何字段上设定primary_key=True 。请参考Model那一章节(前一章)。primary_key=True 暗含着null=False 和unique=True. 一个对象上只能拥有一个主键。主键字段是只读的。如果你改变了一个已存在对象上的主键并且保存的话，会创建一个新的对象，而不是覆盖旧的.
</p>
</section>
<section>
<p>unique</p>
<p>Field.unique</p>
<p>如果为True, 这个字段在表中必须有唯一值.相当于创建了一个UNIQUE类型的索引。这是一个在数据库级别的强制性动作,并且通过模型来验证。如果给unique字段赋予了重复的值，那么调用save()方法会抛出django.db.IntegrityError错误。unique不能用于ManyToManyField、OneToOneField和FileField这3种类型。当设置unique为True时，不需要再指定db_index，因为unique本身就意味着创建一个索引。</p>
</section>
<section>
<p>unique_for_date</p>
<p>Field.unique_for_date</p>
<p>把它的值设成一个DataField或者DateTimeField字段的名称，表示这个字段的值在这个日期内不会重复。例如，你有一个title字段设置unique_for_date="pub_date"，那么Django将不允许两个记录具有相同的title和pub_date。注意，对于DateTimeField类型的字段，只会考虑其日期部分。此外，如果USE_TZ为True，唯一性检查将按照对象保存时的当前的时区进行。这种约束是在Model验证期间通过Model.validate_unique()强制执行的，而不是在数据库层级进行验证。如果unique_for_date的字段不是ModelForm中的字段（例如，exclude中列出的字段或者设置了editable=False），Model.validate_unique()将忽略该约束。</p>
</section>
<section>
<p>unique_for_month</p>
<p>Field.unique_for_month</p>
<p>作用同unique_for_date, 只是时间方面由那一天变成了哪一个月</p>
</section>
<section>
<p>unique_for_year</p>
<p>Field.unique_for_year</p>
<p>作用同unique_for_date, 只是时间方面由那一天变成了哪一个年</p>
</section>
<section>
<p>verbose_name</p>
<p>Field.verbose_name</p>
<p>一个对于人类可读性更高的名称。如果用户没有设定此属性，Django会自动将该字段属性名中的下划线转换为空格，并用它来作为该字段的值。详情参考前一章，Model</p>
</section>
<section>
<p>validators</p>
<p>Field.validators</p>
<p>应用到该字段上的Validator的列表。更多信息参见Validators的文档。Field实现了查询注册API。该API可以用于自定义一个字段类型可用的查询，以及如何从一个字段获取查询。</p>
</section>